home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / kowin / archive / sys / kowin14d.lzh / doc / programming / common.doc < prev    next >
Text File  |  1995-11-24  |  4KB  |  116 lines

  1.  
  2.  Ko-Window プログラマーズマニュアル
  3.  
  4. 「Common 領域について」
  5.  
  6. ● Common 領域 (または共有領域)
  7.  
  8.   各プロセスから共通にアクセスすることのできるメモリです。それぞれ任意の文字
  9. 列による名前をもち、この名前によってどのプログラムでも簡単にその領域をアクセ
  10. スすることができます。
  11.  
  12.  
  13. ● Common 領域の使われ方
  14.  
  15.   どのプロセスからも平等に参照できるメモリとして、初期設定情報や、プロセス起
  16. 動情報の相互参照、Clip Board、または排他的実行におけるロック情報の領域として
  17. 用いられます。
  18.  
  19.  
  20. ● Common 領域の大きさ
  21.  
  22.   Common 領域は、サーバーの HEAP から確保されます。よって確保できるサイズも
  23. サーバーの HEAP 領域の大きさに左右されます。+14 以降はこの Common 領域の管理
  24. システムが改良され、特に個数制限を持つようなことはなくなりました。よって
  25.  WSRV.RC の !Wsrv の項目にある「CommonSize」の設定は意味を持ちません。
  26.  
  27.  
  28. ● Common 領域のアクセス
  29.  
  30.   Common 領域は全部名前がつけられています。この名前は 15 文字以下でなければ
  31. なりません。名前の大文字小文字は明確に区別します。
  32.  
  33.   指定した Common 領域のアドレスを得るには WindowGetCommon( "name", 0 ) を実
  34. 行します。もし確保されていればその先頭アドレス、もし確保されていなければ NULL
  35. を返します。
  36.  
  37.  
  38.   新しく Common 領域を確保するには WindowGetCommon( "name", size ) のように
  39. 実行します。"name" という名前で size 分の大きさの領域を確保し、そのアドレス
  40. を返します。
  41.  
  42.   もしすでに同じ名前の領域が確保されていたならば、その領域をいったん開放して
  43. からあらためて size 分だけのメモリを確保しようとします。この時メモリ内容は
  44.  size 分だけ転送されますが、当然バッファアドレスは変わることになります。
  45.  
  46.  
  47. ●実際のアクセス例  -- 共有メモリとしてのアクセス
  48.  
  49.     void    *ptr;
  50.     ConsoleOpen();
  51.     if( !(ptr= WindowGetCommon( CommonName, 0 )) ){
  52.         if( !(ptr= WindowGetCommon( CommonName, CommonSize )) )
  53.             ConsolePrint( "Common 領域が確保できませんでした\n" );
  54.     }
  55.  
  56.   これは、すでに CommonName の領域が確保されているならそのアドレス、もし確保
  57. されていなければ新しく CommonName という名前で CommonSize 分だけ領域を確保し
  58. そのアドレスを ptr に返します。
  59.  
  60.   プロセス間で共通のメモリを参照する場合には、この形式がもっともよく使われま
  61. す。
  62.  
  63.   プログラムの起動を排他的に行いたい場合ならば、すでに指定の名前の領域が存在
  64. すれば起動をあきらめ、もし起動できたなら EventClose 時に後始末のあとにこの共
  65. 有領域を WindowResetCommon() によって開放するようにします。
  66.  
  67.  
  68. ●実際のアクセス例  -- Clip Board へのアクセス
  69.  
  70.   Clip Board の内容は、ウィンドウマネージャーから UserPaste によって受け取る
  71. ことができます。もしプログラム内で、自分から Clip Board の内容を参照したい場
  72. 合には、"Clip Board" という名前で共有領域を検索すればいいのです。
  73.  
  74.     unsigned char    *cp;
  75.     if( cp= WindowGetCommon( "Clip Board", 0 ) ){
  76.         :
  77.     }
  78.  
  79.   Clip Board にプログラムで文字列を設定するには、次のようにします。
  80.  
  81.     WindowResetCommon( "Clip Board" );
  82.     if( cp= WindowGetCommon( "Clip Board", strlen(buf)+1 ) ){
  83.         strcpy( cp, buf );
  84.     }
  85.  
  86. これは、いったん Clip Board の内容を開放してから(エラーチェックは不用)、文字
  87. 列分だけのバッファを確保し直して、内容転送を行っています。
  88.  
  89.  
  90. ● Common 領域の初期値
  91.  
  92.   WSRV.RC に「!名前」として記述した内容は、起動後 Common 領域として "名前" で
  93. 参照できるようになります。つまり WSRV.RC に記述しているのは、Common 領域の初
  94. 期値です。
  95.  
  96.   例えば、WSRV.RC の「!K20」という項目に、KX_Term20 のさまざまな設定を書いて
  97. おいたとすれば、WindowGetCommon( "K20", 0 ) とすることで参照することができま
  98. す。もちろん "Wsrv" という名前で、サーバーの設定値を参照することもできます。
  99.  
  100.   このように、アプリケーションの設定記述領域として使用する場合、共有領域へ簡
  101. 単にアクセスできるようにするための Common ライブラリが提供されています。
  102.  
  103.   CommonOpen() でアクセスする Common 領域の名前を与えたあと、CommonGetLine()
  104. や CommonGetWord() によって簡単に文字列を切り出すことができるようになってい
  105. ます。ただし、ライブラリ内部では static 領域をワークとして持っているので、同
  106. 時に複数の Common 領域を CommonOpen して参照することはできません。もっとも、
  107. 内部では WindowGetCommon() によって実装されているだけに過ぎませんので、問題
  108. はないでしょう。
  109.  
  110. --
  111. 1993/06/22 初期版
  112. 1995/11/24 +14でCommonSize設定不要になった
  113. 小笠原博之 oga@dgw.yz.yamagata-u.ac.jp
  114. DenDenNET: DEN0006 COR.
  115.  
  116.